package com.open.jack.jk_mpchart

import android.graphics.Color
import com.github.mikephil.charting.components.AxisBase
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import com.github.mikephil.charting.highlight.Highlight
import com.github.mikephil.charting.listener.OnChartValueSelectedListener
import com.open.jack.jk_mpchart.listener.IBarChartListener
import com.open.jack.jk_mpchart.model.JkEntry
import java.text.DecimalFormat


class JkBarChartUtil {
    companion object{
        private fun defaultDecimalFormat():DecimalFormat{
            val b = StringBuffer()
            for (i in 0 until 0) {
                if (i == 0) b.append(".")
                b.append("0")
            }
            return DecimalFormat("###,###,###,##0$b")
            //val defFormat = DecimalFormat("###,###,###,##0$b")
        }

        val sDecimalFormat = defaultDecimalFormat()
    }

    private lateinit var barChart: JkBarChart
    private var data: List<JkEntry>? = null
    private var source: List<Float>? = null
    private val xUnitStringMap = HashMap<Int, String>()
    private var chartListener: IBarChartListener? = null
    private var dataSetColor:String? = null
    private var dataSetColors: List<String>? = null





    private val selectedListener = object : OnChartValueSelectedListener {
        override fun onValueSelected(entry: Entry?, h: Highlight?) {
            if(entry != null){
                // 获取被点击柱子的 X 和 Y 值
                val x = entry.x
                val y = entry.y
                chartListener?.onItemSelected(x.toInt(),y)
//                // 根据 X 值获取对应的标签（如果你使用了 IndexAxisValueFormatter）
//                // 假设你的标签数组叫 labels
//                var label = ""
//                if (x >= 0 && x < xUnitStringMap.size) {
//                    label = xUnitStringMap.get(x.toInt()) ?:""
//                }
//                // 弹出一个 Toast 提示
//                val message = "您点击了 '$label' 的柱子，其值为：$y"
//                //Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
//                Log.d("TAG", "onValueSelected: "+message)
            }
        }

        override fun onNothingSelected() {
            // 当没有柱子被选中时
        }
    }

    fun initCharView(jkBarChart: JkBarChart) {
        jkBarChart.setOnChartValueSelectedListener(selectedListener)
        this.barChart = jkBarChart
        jkBarChart.setScaleEnabled(false)

        val xAxis: XAxis = jkBarChart.getXAxis()
        //xl.axisMinimum = mCableBean.start*1f
        //cableLineChart.setXAliasMinMax(mStart.toFloat(), mEnd.toFloat())
        xAxis.textColor = Color.parseColor("#5A6BC8")
        xAxis.gridColor = Color.parseColor("#5A6BC8")
        xAxis.axisLineColor = Color.parseColor("#5A6BC8")
        xAxis.setGranularity(1f) // 最小间隔为1，防止标签重叠
        xAxis.setAvoidFirstLastClipping(true)
        xAxis.setDrawGridLines(false)
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM)
        xAxis.setAxisLineColor(Color.GRAY); // 设置 X 轴线颜色
        xAxis.setTextColor(Color.GRAY); // 设置 X 轴标签颜色
        // 1. 禁用 X 轴的网格线（垂直线）
        xAxis.setDrawGridLines(false);
        // 2. 禁用 X 轴的横线（轴线）
        xAxis.setDrawAxisLine(false);
        // 3. 保持 X 轴的标签（labels）可见
        xAxis.setDrawLabels(true);
        xAxis.setLabelRotationAngle(45f);
        // 自定义 X 轴标签
        xAxis.valueFormatter = object : IAxisValueFormatter {
            override fun getFormattedValue(value: Float, axis: AxisBase?): String {
                return xUnitStringMap.get(value.toInt()) ?: ""
            }
        }

//        val labels = arrayOf("0~0.002", "0.002~0.04", "0.04~0.12", "0.12以上", "离线")
//        xAxis.valueFormatter = IAxisValueFormatter { value, axis ->
//            if (value >= 0 && value < labels.size) {
//                return@IAxisValueFormatter labels[value.toInt()]
//            }
//            ""
//        }

        // --- 配置 Y 轴 ---
        val leftAxis = jkBarChart.axisLeft
//        leftAxis.axisMinimum = 0f
//        leftAxis.axisMaximum = 1.2f // 修改为略大于1的值，以显示顶部线
        // 自定义 X 轴标签
        leftAxis.valueFormatter = object : IAxisValueFormatter {
            override fun getFormattedValue(value: Float, axis: AxisBase?): String {
                // 检查是否为负零，如果是则返回 "0"
                if (value == -0.0f) {
                    return "0"
                }
                // 否则，返回原始数值的字符串形式
                return sDecimalFormat.format(value.toDouble());
            }
        }

        leftAxis.granularity = 1f
        leftAxis.setDrawAxisLine(true) // 确保轴线被绘制
        leftAxis.axisLineColor = Color.GRAY
        leftAxis.gridColor = Color.parseColor("#BDBDBD")
        leftAxis.setDrawLabels(true)
//        leftAxis.setLabelCount(2, true);
        // 将 Y 轴的偏移量设置为 0，消除与左侧的间距
        leftAxis.xOffset = 0f
        // 隐藏左侧Y轴的竖线
        leftAxis.setDrawAxisLine(false);
        // 隐藏右侧 Y 轴
        jkBarChart.axisRight.isEnabled = false
        // 减少 Y 轴顶部的额外空间
//        leftAxis.setSpaceTop(0.5f)
//        leftAxis.spaceBottom = 0.5f
        jkBarChart.getDescription().isEnabled = false
        jkBarChart.getLegend().setEnabled(false); // 隐藏图例

        jkBarChart.minOffset = 0f
        jkBarChart.setFitBars(true)
    }

    fun setBarChartListener(listener:IBarChartListener){
        chartListener = listener
    }

    fun addBarDataList(barData: List<Float>) {
        source = barData
    }

    fun addData(barData: List<JkEntry>) {
        data = barData
    }

    fun setXAxisLabel(xIndex: Int, label: String) {
        xUnitStringMap.set(xIndex, label)
    }

    fun setBarColors(colors:List<String>){
        dataSetColors = colors
    }

    fun setBarColor(color:String){
        dataSetColor = color
    }

    fun setLeftAxisTextSize(size:Float ){
        // 获取左侧 Y 轴对象
        val leftAxis: YAxis = barChart.getAxisLeft()
        leftAxis.setTextSize(size)
    }

    fun setLeftAxisOffset(offset:Float ){
        // 获取左侧 Y 轴对象
        val leftAxis: YAxis = barChart.getAxisLeft()
        leftAxis.xOffset = offset
    }

    fun setLeftAxisTextColor(color:String){
        // 获取左侧 Y 轴对象
        val leftAxis: YAxis = barChart.getAxisLeft()
        // 设置 Y 轴标签文字颜色
        leftAxis.textColor = Color.parseColor(color)
    }


    fun setXAxisTextSize(size:Float ){
        // 获取 X 轴对象
        val xAxis: XAxis = barChart.getXAxis()
        xAxis.setTextSize(size)
    }

    fun setXAxisTextColor(color:String){
        // 获取 X 轴对象
        val xAxis: XAxis = barChart.getXAxis()
        // 设置 X 轴标签文字颜色
        xAxis.textColor =  Color.parseColor(color)
    }
    // leftAxis.gridColor = Color.parseColor("#BDBDBD")
    fun setLeftAxiGridColor(color:String){
        val leftAxis: YAxis = barChart.getAxisLeft()
        leftAxis.gridColor = Color.parseColor(color)
    }

    /**
     * 清除高亮
     */
    fun clearHighlight(){
        barChart.highlightValues(null)
    }

    fun updateView() {
        val list = source
        if (list != null) {
            val entries = ArrayList<BarEntry>()
            list.forEachIndexed { index, value ->
                entries.add(BarEntry(index.toFloat(), value))
            }

            val dataSet = BarDataSet(entries, "")
//            dataSet.isHighlightEnabled = false
//            dataSet.setColor(Color.parseColor("#44D2A9"))// 设置柱子颜色为绿色
//            dataSet.setColors(colors)
            if(dataSetColor != null){
                dataSet.setColors(Color.parseColor(dataSetColor))
            }else if(dataSetColors != null){
                dataSet.setColors( dataSetColors!!.map { Color.parseColor(it) })
            }

            dataSet.setDrawValues(false)// 隐藏柱子上方的值
            //dataSet.fills = gradientFills

            val barData = BarData(dataSet)
            barData.barWidth = 0.9f // 设置柱子的宽度
            barChart.data = barData
            barChart.invalidate()
        }


    }
}